home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / formats / iff / newiff.lzh / NewIFF / NewIFF.lzh / newiff / apps / ILBMLoad / ILBMLoad.c < prev   
C/C++ Source or Header  |  1992-05-18  |  6KB  |  235 lines

  1. /* ILBMLoad.c 04/92  C. Scheppner CBM
  2.  *
  3.  * Example which
  4.  *  - first queries an ILBM to determine size and mode
  5.  *  - then opens an appropriate screen and window
  6.  *  - then loads the ILBM into the already opened screen
  7.  *
  8.  * For clipboard, use filename -c[unit] (like -c, -c1, -c2, etc.)
  9.  *
  10.  * requires linkage with several IFF modules
  11.  * see Makefile
  12.  */
  13. #define INTUI_V36_NAMES_ONLY
  14.  
  15. #include "iffp/ilbmapp.h"
  16.  
  17.  
  18. #ifdef LATTICE
  19. int CXBRK(void) { return(0); }  /* Disable Lattice CTRL/C handling */
  20. int chkabort(void) { return(0); }  /* really */
  21. #endif
  22.  
  23. void cleanup(void);
  24. void bye(UBYTE *s,int error);
  25.  
  26. #define MINARGS 2
  27. char *vers = "$VER: ILBMLoad 37.9";
  28. char *Copyright = "ILBMLoad v37.9 (Freely Redistributable)";
  29. char *usage = "Usage: ILBMLoad ilbmname (-c[unit] for clipboard";
  30.  
  31.  
  32. struct Library *IntuitionBase  = NULL;
  33. struct Library *GfxBase        = NULL;
  34. struct Library *IFFParseBase   = NULL;
  35.  
  36. /* Note - these fields are also available in the ILBMInfo structure */
  37. struct   Screen         *scr;         /* for ptr to screen structure */
  38. struct   Window         *win;         /* for ptr to window structure */
  39. struct   RastPort       *wrp;         /* for ptr to RastPort  */
  40. struct   ViewPort       *vp;          /* for ptr to Viewport  */
  41.  
  42. struct   IntuiMessage   *msg;
  43.  
  44. struct   NewWindow      mynw = {
  45.    0, 0,                                  /* LeftEdge and TopEdge */
  46.    0, 0,                                /* Width and Height */
  47.    -1, -1,                                /* DetailPen and BlockPen */
  48.    IDCMP_VANILLAKEY | IDCMP_MOUSEBUTTONS, /* IDCMP Flags with Flags below */
  49.    WFLG_BACKDROP | WFLG_BORDERLESS |
  50.    WFLG_SMART_REFRESH | WFLG_NOCAREREFRESH |
  51.    WFLG_ACTIVATE | WFLG_RMBTRAP,
  52.    NULL, NULL,                            /* Gadget and Image pointers */
  53.    NULL,                                  /* Title string */
  54.    NULL,                                  /* Screen ptr null till opened */
  55.    NULL,                                  /* BitMap pointer */
  56.    50, 20,                                /* MinWidth and MinHeight */
  57.    0 , 0,                                 /* MaxWidth and MaxHeight */
  58.    CUSTOMSCREEN                           /* Type of window */
  59.    };
  60.  
  61.  
  62. BOOL   FromWb;
  63.  
  64.  
  65. /* ILBM Property chunks to be grabbed
  66.  * List BMHD, CMAP and CAMG first so we can skip them when we write
  67.  * the file back out (they will be written out with separate code)
  68.  */
  69. LONG    ilbmprops[] = {
  70.         ID_ILBM, ID_BMHD,
  71.         ID_ILBM, ID_CMAP,
  72.         ID_ILBM, ID_CAMG,
  73.         ID_ILBM, ID_CCRT,
  74.         ID_ILBM, ID_AUTH,
  75.         ID_ILBM, ID_Copyright,
  76.         TAG_DONE
  77.         };
  78.  
  79. /* ILBM Collection chunks (more than one in file) to be gathered */
  80. LONG    ilbmcollects[] = {
  81.         ID_ILBM, ID_CRNG,
  82.         TAG_DONE
  83.         };
  84.  
  85. /* ILBM Chunk to stop on */
  86. LONG    ilbmstops[] = {
  87.         ID_ILBM, ID_BODY,
  88.         TAG_DONE
  89.         };
  90.  
  91.  
  92. UBYTE nomem[]  = "Not enough memory\n";
  93. UBYTE noiffh[] = "Can't alloc iff\n";
  94.  
  95.  
  96.  
  97. /* For our allocated ILBM frame */
  98. struct ILBMInfo  *ilbm;
  99.  
  100.  
  101. /* 
  102.  * MAIN 
  103.  */
  104. void main(int argc, char **argv)
  105.    {
  106.    UBYTE *ilbmname=NULL;
  107.    LONG error = 0L;
  108.  
  109.    FromWb = argc ? FALSE : TRUE;
  110.  
  111.    if((argc<MINARGS)||(argv[argc-1][0]=='?'))
  112.     {
  113.     printf("%s\n%s\n",Copyright,usage);
  114.         bye("",RETURN_OK);
  115.     }
  116.  
  117.    ilbmname = argv[1];
  118.  
  119.    /* Open Libraries */
  120.  
  121.    if(!(IntuitionBase = OpenLibrary("intuition.library", 0)))
  122.       bye("Can't open intuition library.\n",RETURN_WARN);
  123.       
  124.    if(!(GfxBase = OpenLibrary("graphics.library",0)))
  125.       bye("Can't open graphics library.\n",RETURN_WARN);
  126.  
  127.    if(!(IFFParseBase = OpenLibrary("iffparse.library",0)))
  128.       bye("Can't open iffparse library.\n",RETURN_WARN);
  129.  
  130.  
  131.  
  132. /* 
  133.  * Alloc one ILBMInfo struct
  134.  */
  135.     if(!(ilbm = (struct ILBMInfo *)
  136.     AllocMem(sizeof(struct ILBMInfo),MEMF_PUBLIC|MEMF_CLEAR))) 
  137.         bye(nomem,RETURN_FAIL);
  138.  
  139. /*
  140.  * Here we set up our ILBMInfo fields for our
  141.  * application.
  142.  * Above we have defined the propery and collection chunks
  143.  * we are interested in (some required like BMHD)
  144.  */
  145.  
  146.     ilbm->ParseInfo.propchks    = ilbmprops;
  147.     ilbm->ParseInfo.collectchks    = ilbmcollects;
  148.     ilbm->ParseInfo.stopchks    = ilbmstops;
  149.  
  150.     ilbm->windef    = &mynw;
  151.  
  152. /* 
  153.  * Alloc IFF handle for frame
  154.  */
  155.     if(!(ilbm->ParseInfo.iff = AllocIFF())) bye(noiffh,RETURN_FAIL);
  156.  
  157. /* Normally you would use showilbm() to open an appropriate acreen
  158.  * and display an ILBM in it.
  159.  *
  160.  * However, here we are demonstrating
  161.  *  - first querying an ILBM to get its BMHD and CAMG (real or computed)
  162.  *  - then opening our own display
  163.  *  - then loading the ILBM into it
  164.  */
  165.  
  166.     if(!(error = queryilbm(ilbm,ilbmname)))
  167.     {
  168.     D(bug("ilbmload: after query, this ILBM is %ld x %ld x %ld, modeid=$%lx\n",
  169.         ilbm->Bmhd.w, ilbm->Bmhd.h, ilbm->Bmhd.nPlanes, ilbm->camg));
  170.  
  171.     /* Note - you could use your own routines to open your
  172.      * display, but if so, you must initialize ilbm->scr,
  173.      * ilbm->win, ilbm->wrp, ilbm->srp, and ilbm->vp for your display.
  174.      * Here we will use opendisplay() which will initialize
  175.      * those fields.
  176.      */
  177.     if(!(opendisplay(ilbm,
  178.             MAX(ilbm->Bmhd.pageWidth, ilbm->Bmhd.w),
  179.             MAX(ilbm->Bmhd.pageHeight,ilbm->Bmhd.h),
  180.             MIN(ilbm->Bmhd.nPlanes,MAXAMDEPTH),
  181.             ilbm->camg)))
  182.         {
  183.         printf("Failed to open display\n");
  184.         }
  185.     else
  186.         {
  187.         D(bug("ilbmload: opendisplay successful\n"));
  188.  
  189.         scr = ilbm->scr;
  190.         win = ilbm->win;
  191.  
  192.         if(!(error = loadilbm(ilbm, ilbmname)))
  193.         {
  194.             D(bug("ilbmload: loadilbm successful\n"));
  195.  
  196.         /* Note - we don't need to examine or copy any
  197.          * chunks from the file, so we will close file now
  198.          */
  199.         closeifile(ilbm);
  200.         ScreenToFront(ilbm->scr);
  201.         Wait(1<<win->UserPort->mp_SigBit);
  202.         unloadilbm(ilbm);    /* deallocs colors, closeifile if needed */
  203.         }
  204.         closedisplay(ilbm);
  205.          }
  206.           }
  207.  
  208.     if(error)    printf("%s\n",IFFerr(error));
  209.  
  210.     cleanup();
  211.     exit(RETURN_OK);
  212.     }
  213.  
  214.  
  215. void bye(UBYTE *s,int error)
  216.    {
  217.    if((*s)&&(!FromWb)) printf("%s\n",s);
  218.    cleanup();
  219.    exit(error);
  220.    }
  221.  
  222.  
  223. void cleanup()
  224.    {
  225.    if(ilbm)
  226.     {
  227.     if(ilbm->ParseInfo.iff)     FreeIFF(ilbm->ParseInfo.iff);
  228.     FreeMem(ilbm,sizeof(struct ILBMInfo));
  229.     }
  230.  
  231.    if(GfxBase)              CloseLibrary(GfxBase);
  232.    if(IntuitionBase)     CloseLibrary(IntuitionBase);
  233.    if(IFFParseBase)      CloseLibrary(IFFParseBase);
  234.    }
  235.